{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Multi-threaded Parallelism\n",
    "\n",
    "author: Jacob Schreiber <br>\n",
    "contact: jmschreiber91@gmail.com\n",
    "\n",
    "pomegranate supports parallelization through a set of built in functions based off of joblib. All computationally intensive functions in pomegranate are implemented in cython with the global interpreter lock (GIL) released, allowing for multithreading to be used for efficient parallel processing. \n",
    "\n",
    "These functions can all be simply parallelized by passing in `n_jobs=X` to the method calls. This tutorial will demonstrate how to use those calls. First we'll look at a simple multivariate Gaussian mixture model, and compare its performance to sklearn. Then we'll look at a hidden Markov model with Gaussian emissions, and lastly we'll look at a mixture of Gaussian HMMs. These can all utilize the build-in parallelization that pomegranate has.\n",
    "\n",
    "Let's dive right in!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fri Jan 10 2020 \n",
      "\n",
      "numpy 1.18.1\n",
      "scipy 1.4.1\n",
      "pomegranate 0.12.0\n",
      "\n",
      "compiler   : Clang 10.0.0 (clang-1000.11.45.5)\n",
      "system     : Darwin\n",
      "release    : 17.7.0\n",
      "machine    : x86_64\n",
      "processor  : i386\n",
      "CPU cores  : 4\n",
      "interpreter: 64bit\n"
     ]
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import numpy\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn; seaborn.set_style('whitegrid')\n",
    "\n",
    "from pomegranate import *\n",
    "\n",
    "numpy.random.seed(0)\n",
    "numpy.set_printoptions(suppress=True)\n",
    "\n",
    "%load_ext watermark\n",
    "%watermark -m -n -p numpy,scipy,pomegranate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def create_dataset(n_samples, n_dim, n_classes, alpha=1):\n",
    "    \"\"\"Create a random dataset with n_samples in each class.\"\"\"\n",
    "    \n",
    "    X = numpy.concatenate([numpy.random.normal(i*alpha, 1, size=(n_samples, n_dim)) for i in range(n_classes)])\n",
    "    y = numpy.concatenate([numpy.zeros(n_samples) + i for i in range(n_classes)])\n",
    "    idx = numpy.arange(X.shape[0])\n",
    "    numpy.random.shuffle(idx)\n",
    "    return X[idx], y[idx]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Naive Bayes\n",
    "\n",
    "Let's start off with a simple model like naive Bayes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sklearn GNB\n",
      "2.24 s ± 204 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
      "\n",
      "pomegranate GNB\n",
      "3.06 s ± 294 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
      "\n",
      "pomegranate GNB (2 jobs)\n",
      "1.95 s ± 125 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
      "\n",
      "pomegranate GNB (4 jobs)\n",
      "1.65 s ± 191 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.naive_bayes import GaussianNB\n",
    "\n",
    "n, d, k = 50000, 1000, 2\n",
    "X, y = create_dataset(n, d, k)\n",
    "\n",
    "print(\"sklearn GNB\")\n",
    "%timeit GaussianNB().fit(X, y)\n",
    "print() \n",
    "print(\"pomegranate GNB\")\n",
    "%timeit NaiveBayes.from_samples(NormalDistribution, X, y)\n",
    "print()\n",
    "print(\"pomegranate GNB (2 jobs)\")\n",
    "%timeit NaiveBayes.from_samples(NormalDistribution, X, y, n_jobs=2)\n",
    "print()\n",
    "print(\"pomegranate GNB (4 jobs)\")\n",
    "%timeit NaiveBayes.from_samples(NormalDistribution, X, y, n_jobs=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It looks like scikit-learn starts off as faster on a single thread, but that adding multiple threads will improve pomegranate's performance, typically past that of scikit-learn on a single thread. The reason this is the case is likely because pomegranate has to create one object per feature per class, whereas scikit-learn will just define the means and variances in a matrix. It's efficient when you know what distribution you're implementing in the naive Bayes, but not as modular."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. Bayes' Classifier\n",
    "\n",
    "The next complex model is the Bayes' classifier. This model is similar to the naive Bayes' model, but does not require that the features are independent from each other."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "pomegranate GBC\n",
      "6.59 s ± 1.21 s per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
      "\n",
      "pomegranate GBC (2 jobs)\n",
      "5.3 s ± 317 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
      "\n",
      "pomegranate GBC (4 jobs)\n",
      "5.58 s ± 502 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    }
   ],
   "source": [
    "print(\"pomegranate GBC\")\n",
    "%timeit BayesClassifier.from_samples(MultivariateGaussianDistribution, X, y)\n",
    "print()\n",
    "print(\"pomegranate GBC (2 jobs)\")\n",
    "%timeit BayesClassifier.from_samples(MultivariateGaussianDistribution, X, y, n_jobs=2)\n",
    "print()\n",
    "print(\"pomegranate GBC (4 jobs)\")\n",
    "%timeit BayesClassifier.from_samples(MultivariateGaussianDistribution, X, y, n_jobs=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We see a nice spead improvement here as well. There is no model to compare against in scikit-learn because their naive Bayes' model assumes that all features are independent."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. General Mixture Models\n",
    "\n",
    "Next, lets take a look at Gaussian mixture models."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sklearn GMM\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/ksachdeva/Desktop/Dev/myoss/pomegranate/env/lib/python3.7/site-packages/sklearn/mixture/_base.py:267: ConvergenceWarning: Initialization 1 did not converge. Try different init parameters, or increase max_iter, tol or check for degenerate data.\n",
      "  % (init + 1), ConvergenceWarning)\n",
      "/Users/ksachdeva/Desktop/Dev/myoss/pomegranate/env/lib/python3.7/site-packages/sklearn/mixture/_base.py:267: ConvergenceWarning: Initialization 1 did not converge. Try different init parameters, or increase max_iter, tol or check for degenerate data.\n",
      "  % (init + 1), ConvergenceWarning)\n",
      "/Users/ksachdeva/Desktop/Dev/myoss/pomegranate/env/lib/python3.7/site-packages/sklearn/mixture/_base.py:267: ConvergenceWarning: Initialization 1 did not converge. Try different init parameters, or increase max_iter, tol or check for degenerate data.\n",
      "  % (init + 1), ConvergenceWarning)\n",
      "/Users/ksachdeva/Desktop/Dev/myoss/pomegranate/env/lib/python3.7/site-packages/sklearn/mixture/_base.py:267: ConvergenceWarning: Initialization 1 did not converge. Try different init parameters, or increase max_iter, tol or check for degenerate data.\n",
      "  % (init + 1), ConvergenceWarning)\n",
      "/Users/ksachdeva/Desktop/Dev/myoss/pomegranate/env/lib/python3.7/site-packages/sklearn/mixture/_base.py:267: ConvergenceWarning: Initialization 1 did not converge. Try different init parameters, or increase max_iter, tol or check for degenerate data.\n",
      "  % (init + 1), ConvergenceWarning)\n",
      "/Users/ksachdeva/Desktop/Dev/myoss/pomegranate/env/lib/python3.7/site-packages/sklearn/mixture/_base.py:267: ConvergenceWarning: Initialization 1 did not converge. Try different init parameters, or increase max_iter, tol or check for degenerate data.\n",
      "  % (init + 1), ConvergenceWarning)\n",
      "/Users/ksachdeva/Desktop/Dev/myoss/pomegranate/env/lib/python3.7/site-packages/sklearn/mixture/_base.py:267: ConvergenceWarning: Initialization 1 did not converge. Try different init parameters, or increase max_iter, tol or check for degenerate data.\n",
      "  % (init + 1), ConvergenceWarning)\n",
      "/Users/ksachdeva/Desktop/Dev/myoss/pomegranate/env/lib/python3.7/site-packages/sklearn/mixture/_base.py:267: ConvergenceWarning: Initialization 1 did not converge. Try different init parameters, or increase max_iter, tol or check for degenerate data.\n",
      "  % (init + 1), ConvergenceWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "30.5 s ± 1.46 s per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
      "\n",
      "pomegranate GMM\n",
      "17 s ± 406 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
      "\n",
      "pomegranate GMM (2 jobs)\n",
      "15.6 s ± 273 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
      "pomegranate GMM (4 jobs)\n",
      "15.6 s ± 259 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.mixture import GaussianMixture\n",
    "\n",
    "n, d, k = 1000000, 5, 3\n",
    "X, y = create_dataset(n, d, k)\n",
    "\n",
    "print(\"sklearn GMM\")\n",
    "%timeit GaussianMixture(n_components=k, covariance_type='full', max_iter=15, tol=1e-10).fit(X)\n",
    "print()\n",
    "print(\"pomegranate GMM\")\n",
    "%timeit GeneralMixtureModel.from_samples(MultivariateGaussianDistribution, k, X, max_iterations=15, stop_threshold=1e-10)\n",
    "print()\n",
    "print(\"pomegranate GMM (2 jobs)\")\n",
    "%timeit GeneralMixtureModel.from_samples(MultivariateGaussianDistribution, k, X, n_jobs=2, max_iterations=15, stop_threshold=1e-10)\n",
    "print\n",
    "print(\"pomegranate GMM (4 jobs)\")\n",
    "%timeit GeneralMixtureModel.from_samples(MultivariateGaussianDistribution, k, X, n_jobs=4, max_iterations=15, stop_threshold=1e-10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It looks like pomegranate can be faster than sklearn at performing 15 iterations of EM on this data set, and that parallelization can speed things up even further. We can ignore the convergence warnings. Here we're just timing a fixed amount of computational work. Different models might converge after a different number of iterations, and we don't want the pseedup to come just from that.\n",
    "\n",
    "Lets now take a look at the time it takes to make predictions using GMMs. Lets fit the model to a small amount of data, and then predict a larger amount of data drawn from the same underlying distributions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sklearn GMM\n",
      "3.72 s ± 270 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
      "\n",
      "pomegranate GMM\n",
      "2.07 s ± 65.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
      "\n",
      "pomegranate GMM (4 jobs)\n",
      "1.52 s ± 76 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    }
   ],
   "source": [
    "X, _ = create_dataset(1000, 25, 2)\n",
    "\n",
    "a = GaussianMixture(k, n_init=1, max_iter=25).fit(X)\n",
    "b = GeneralMixtureModel.from_samples(MultivariateGaussianDistribution, k, X, max_iterations=25)\n",
    "\n",
    "X, _ = create_dataset(1000000, 25, 2)\n",
    "\n",
    "print(\"sklearn GMM\")\n",
    "%timeit -n 1 a.predict_proba(X)\n",
    "print()\n",
    "print(\"pomegranate GMM\")\n",
    "%timeit -n 1 b.predict_proba(X)\n",
    "print()\n",
    "print(\"pomegranate GMM (4 jobs)\")\n",
    "%timeit -n 1 b.predict_proba(X, n_jobs=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It looks like pomegranate can be slightly slower than sklearn when using a single processor, but that it can be parallelized to get faster performance.\n",
    "\n",
    "To ensure that we're getting the exact same results, only faster, lets subtract the predictions from each other and make sure that the sum is equal to 0."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.0\n"
     ]
    }
   ],
   "source": [
    "print((b.predict_proba(X) - b.predict_proba(X, n_jobs=4)).sum())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Great, no difference between the two.\n",
    "\n",
    "Lets now make sure that pomegranate and sklearn are learning basically the same thing. Lets fit both models to some 2 dimensional 2 component data and make sure that they both extract the underlying clusters by plotting them."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA50AAAF1CAYAAABrpI6MAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOzde5wT9b0//tckgcCKQAmSdbUsbssuKSJej90KFgFtBfXnrRZdOKi1FlAPvWjVg1q1Z7Vq1YOew+1oleJaxWptq3hFt6KuPmyLtxrYhXUXcN0A4QvILZDk8/sjO9lJ8pnJzOSefT0fDx9qLpPJBOaV+eT9eX8UIYQAERERERERUQ44Cr0DREREREREVL540UlEREREREQ5w4tOIiIiIiIiyhledBIREREREVHO8KKTiIiIiIiIcoYXnURERERERJQzvOikPmPLli2oq6tDZ2enpfuKyfvvv4+6ujqEw+GMt/Xyyy9j27ZtWdgrIiKivuXgwYN46qmnsr7dbH4fee+999Da2pqFvSLKHC86ifqgL774AvPnz8e+ffsKvStEREQl58UXX8SiRYsKvRuGZs+eje3btxd6N4gA8KKTqE8SQhR6F4iIiEoWc5TIGl50UtlpamrClClTMG7cOJx77rl48803pY97+umnccIJJ+DDDz9Mue+rr77CjTfeiJNOOgmnnXYabr31VuzZsyd+/5tvvokLLrgA48aNw0knnYSf/vSn8fsffvhhzJkzB7NmzcIpp5yCt956C5MnT8YTTzyBGTNmYNy4cTjvvPPw8ccf676Hzz77DDNnzsT48eMxZcoU/PGPf0x5jKwE5+GHH8all14KADh06BB+9atfob6+HuPHj8cVV1yB9vZ2AMCUKVMAAGeddRaee+45AMDrr7+O6dOnY/z48bjgggvw1ltvxbc7a9Ys3HnnnTjzzDMxceJE7Nixw/RxJiKi0qTmzF/+8hecfvrpOPnkk3HnnXfi0KFD8cesXbsWl156KY4//nhMnjwZTU1N8ftuuukm/OY3v8HPfvYzjB8/HtOnT8e6devw4IMP4uSTT8Z3v/tdvPrqq/HHd3d3Y968eTj++OMxadIk/Pa3v8XBgwfj97/99ts499xzcdxxx+Gqq67Cr3/9a9x0000A5Nm7detW/Md//AdOOeUUHHvssTj//PPxwQcfJLy3V155BWeeeSbGjRuHH//4x9ixY0f89Z599lmcffbZOPbYY3HqqafiV7/6FcLhMN5//33cfPPNCAQCqKurw5YtWyCEwKJFizBx4kScdNJJ+NGPfoSOjg7dY7t582b85Cc/wQknnIDTTz8dS5YskT6urq4O7777bvz/n3vuOZx++unx/1+4cCEmTpyIcePG4Yc//CHWrl0LAJg8eTIA4IorrsDDDz8MAPj73/+Oiy++GMcddxymT5+O559/PuGzuvHGG3H++efj1FNPxfr16/Hyyy9j2rRpGDduHM466yw8++yzuu+HKC1BVEb+9a9/ibFjx4rXXntNbNmyRSxatEgcd9xxYteuXWLz5s2itrZWdHR0iNdff12MHz9evPPOO0IIkXCfEEJce+214sc//rHw+/3ik08+EQ0NDeLaa68VQgixadMmMXbsWPHUU0+JzZs3izVr1ohTTz1VLFu2TAghxEMPPSRqa2vFihUrhN/vF1999ZU444wzxKmnnipee+010d7eLhoaGsTFF18sfQ/BYFCccsop4tZbbxUbN24Uf/3rX8XYsWPFBx98IN577z1RW1srDh06lLLP6mvPmDFDCCHEY489JqZMmSI++ugj0dHRIa655hpxySWXCCGE+Oijj0Rtba1Yu3at2L9/v/D7/eL4448Xf/rTn0RnZ6d48sknxbhx48Rnn30mhBBi5syZYvz48eKDDz4QH3/8seFxJiKi8qDmzFlnnRXPoIkTJ4p7771XCCHEhg0bxLhx48T9998v2tvbxXPPPSfGjx8vVq1aJYQQ4sYbbxRjx44VK1asEJ9//rn44Q9/KE4++WRx6623ig0bNoibb75Z/Nu//ZuIRqMiGo2KCy+8UNx0001iw4YN4oMPPhDTp08Xd999txAilr3HHnusePjhh8XGjRvFf//3f4u6ujpx4403CiHk2Tt79mwxd+5csWHDBtHW1iZ+8pOfiLPPPjvhvV1wwQXiww8/FB9++KGor6+Pv7cPPvhAjBs3Trzyyitiy5Yt4qWXXhLHHnusePHFF0UoFBKPP/64OO2008TWrVtFOBwWv//978VZZ50l3n33XbFhwwZxxx13iNNPP13s27cv5biGQiFx5plninnz5on169eLt956S5x00kniz3/+c0q219bWxr+rCCHEs88+KyZOnCiEEOLVV18Vp5xyinjvvffEpk2bxO233y4mTJggIpGICAaDora2VqxatUrs2bNHbN26VZxwwgni8ccfFx0dHeLFF18UJ510kli9enX8sxozZox49dVXxUcffSS2b98uxo4dK55++mmxZcsW8cc//lGMGTNGbNiwIet/zqhvcBX6opcom7744gsAwFFHHYWjjjoKP/nJTzBu3Dj069cv/pi1a9fijjvuwD333IPvfOc7KdvYtGkTXnvtNbz33nsYOnQoAOCee+7B5MmT8eWXXyISiWDBggX44Q9/CAA4+uij8Z3vfAcbNmyIb2Po0KGYOXNmwnbPP/98TJ06FUBs5PHaa6+VvoeXXnoJhx12GH71q1/B6XSipqYGO3fuRDQatXQstmzZggEDBuDoo4/GsGHDcPvtt8dHXYcNGwYA+NrXvoYBAwbg0UcfxUUXXYTzzz8fADBy5Eh8/PHHWLFiBe666y4AiI9yA8Brr70GwPg4ExFRebj++uvj5//58+fj3nvvxS9+8QusXLkSdXV1+PnPfw4AOOaYY7Bx40Y88sgjOPvsswEAY8aMiefh9OnTcc8992DBggVwu92YOXMmnn32Wfy///f/sH79emzZsgUrV66E0+kEANx222248sorcf311+OZZ57B2LFj49k5f/78hF8AgdTsPeOMM3DWWWfhyCOPBAA0NDTgqquuSiiNvfbaazF+/HgAwLnnnotPPvkEADBgwAA0NjbirLPOAhDLu8ceewwbNmzAtGnTcPjhh8PhcOCII44AADzyyCO45ZZbUF9fDwC49dZb8be//Q2vvPJKPFtV7777LrZu3Ypnn30Whx9+OGpra3HbbbehoqLC0ufyxRdfwOVyoaqqCl//+tfxi1/8AmeddRai0Wg854cMGYLDDjsM//d//4dTTz0Vs2fPBgBUV1ejvb0dy5cvj/8q6vP5cOaZZwKIVVwdOnQIXq8XRx11FC666CJUVVVh+PDhlvaRSMWLTiorEyZMwLe+9S2cf/75qK2txeTJk3HxxRdj4MCB8cfceuutiEQiOOqoo6Tb2LhxI4QQOOOMM1Lu6+joQH19Pfr374/Fixejra0NbW1t2LBhA6ZPnx5/nGzbX//61+P/PWjQIESjUUQikXi4qjZs2IAxY8Yk3K6G6Pvvv2/ySAAzZszASy+9hIkTJ+LEE0/ElClTcNFFF+m+59bW1oTSmUOHDuG4446Tviczx5mIiMrDCSecEP/vY489Fjt37sT27duxcePG+AWb9rHaEltt9g0YMADDhw+H2+0GgPi/Dx48iI0bN2L37t3xi1sgNm/y0KFD6Orqwvr163HssccmvNbxxx+PXbt2xf8/OXsvvfRSrFq1Cv/85z/x+eef49NPPwUARCKR+GNGjhwZ/+9BgwbFu8Mfe+yxGDBgAB566CFs2LAB69evR2dnJ7797W+nHJ+9e/eiu7sb119/PRyO3plroVBIWmK7YcMGjBw5Eocffnj8tvPOOw9AbMDYrOnTp+MPf/hDvDxYzWKXK/XrfXt7O9asWZPwWYbD4fjFKRAbRFf5fD5MnjwZV199NUaOHIkzzjgDF154IYYMGWJ6/4i0eNFJZWXgwIF4+umn8Y9//ANvvvkmXn75ZTzxxBNoamrCoEGDAADXXXcd2tracPvtt2PlypUJAQHEwqiioiJhroPqiCOOwLp163DppZfijDPOwEknnYTLL78cy5cvT3icGqRa/fv3T7lNSBoRmP21UFGUlNu0S6l885vfxBtvvIG33noLzc3NWLJkCVauXBmfw6kViUTwox/9CBdeeKHuPmv/2+g4jxkzxtT+ExFRadAOgqpVNw6HAwMGDEh5rDqgKnuu+jyZcDiM6upqLF26NOW+ysrKlO0AqRmqzd5oNIorr7wSu3btwrRp0zB58mQcOnQopcooOXPVba5Zswbz5s3D+eefj4kTJ+Kaa67BHXfcId139f0+8MAD+OY3v5lwn/bCUu81rdAe2yOOOAIvvvgiWlpa8Le//Q1PP/00mpqa8Oyzz8Lr9SY8LxwOY/r06Zg3b17C7drPQ5vziqJg8eLF+Ne//oU33ngDb7zxBp588kksWbIEEyZMsL3/1HexkRCVlbVr12LRokU4+eSTccMNN+Cll17C8OHDE5rifO9738P111+PjRs3YuXKlSnbOOaYY7Bv3z5EIhFUV1ejuroaAHD33Xdjz549+POf/4wTTzwRDzzwABoaGnDcccehs7Mza53sqqursX79+oRy2ptvvhkLFy5MeJwaWnv37o3fph0hff755/H666/jzDPPRGNjI55//nls3LgR69evT7lgPeaYY7B58+b4+62ursaf//zneBltMjPHmYiIysO6devi//3pp59i+PDh8Hg8qKmpwUcffZTw2LVr1+KYY46x/BrHHHMMuru7MXTo0HgObdu2Dffffz+EEBg9enT8l0rVv/71L93tbdiwAR988AEeffRRzJ07F5MmTcLWrVsBmOs8+8wzz+CCCy7Ar3/9a/zgBz/AN77xDWzatCl+vzZHBw8eDI/Hg23btsX3/eijj8YDDzyA9evXp2x71KhR2Lx5c0KDwoceeijeFEmrX79+CTm/efPm+H83Nzfj6aefxsSJE3HLLbfglVdewd69e/GPf/wjZTvHHHMMOjs7E3L+7bffljYqBGIVUL/5zW8wduxYXHfddfjTn/6Ek08+Wfd7AVE6vOiksjJgwAAsWrQITz31FLZs2YI33ngDX375ZUpJjtfrxdy5c/Hggw8mdKoDgG984xuYOHEifvnLX+Kjjz7CunXrcOONNyIYDGLEiBEYOnQoWltb8dFHH6GjowO/+c1v8MknnyR088vEeeedh7179+Kuu+7C559/jr/+9a944YUXMHHixITHDR8+HEceeSR+97vfYfPmzXj++efR3Nwcv/+rr75CY2Mj3n77bWzZsgXPPvssKioqMGrUqPi8kXXr1mHv3r24/PLL8fLLL+Pxxx9HZ2cn/vCHP2DJkiXxC+5kZo8zERGVvrvuuguffPIJWlpa8NBDD+Gyyy6Doii47LLL0NraigceeACff/45nn/+eTz55JMpPQ3MmDBhAo4++mhcf/31WLduHdauXYtbbrkFDocDbrcbl1xyCT799FMsWbIEn3/+OZYuXYq///3v0qofIHYh6HA4sGrVKnzxxRd4+eWX411ctR1x9QwdOhRr167FunXr0NbWhptuugnbtm2LP7eiogJfffUVPv/8c4TDYVx++eVYuHAhXn/9dXR2duKOO+7Au+++i5qaGul7raysxC233IKNGzfib3/7G1asWJHQlVY1btw4NDU1oaOjA2+++WZCtVI0GsW9996Ll19+GVu2bMFf/vIXHDx4MF5xVFFRgba2Nnz11Ve47LLL8Nlnn+H+++9HR0cHXn75Zdx3330pv4hqj99TTz2Fhx9+GJs3b8Z7770nLXEmMosXnVRWfD4f7r77bixfvhxnn3027r77btx4443ShkGXX345Bg8ejPvuuy/lvnvvvRfV1dW48sorMXPmTIwYMSK+CPSsWbNw4okn4oorrsCMGTPwxRdf4Nprr8Vnn32Wlfdw+OGHY9myZfj4449x3nnn4X/+539w11134cQTT0x4nMPhQGNjIz799FNMmzYNL7zwQkLZTENDAy688ELcfPPNOPvss7F69WosXboUQ4YMwde+9jVceOGF+MUvfoFnnnkGxx9/PH77299i5cqVmD59Oh5//HHcdddd+O53vyvdRyvHmYiIStv06dMxZ84c/OxnP8NFF12EuXPnAoiVvS5dujS+lMmiRYtw00034Qc/+IHl13A6nVi8eDGcTidmzJiBOXPm4OSTT8Z//dd/AYjN13zooYfwpz/9Ceeeey7++c9/YurUqbqlqpWVlbj99tvx2GOPYfr06Vi6dCluueUW9OvXD36/P+3+XHvttRgxYgRmzJiBK664Av369UNDQ0M867/97W+jpqYG5513Hvx+P370ox9hxowZuOOOO3DeeeehtbUVjz76qPSizul0YtGiRdi1axcuuOAC3H777bjmmmswbdq0lMfeeuut2L17N8455xwsXboU8+fPj983efJk/PSnP8W9996L73//+3jsscdw//33xy90L7/8ctx///14+OGHcdRRR2Hp0qV49913cc455+Cee+7Bddddh8suu0z6/o844gg8/PDDWL16NaZPn44bbrgBl156KS6++OK0x45IRhHZqgkkIiIiorKxZcsWTJkyBa+++qpu5Uu+tLa2IhwO41vf+lb8tquvvhrjxo3DddddV8A9IyIz+EsnERERERW1TZs24fLLL8c777yDL774As888wxaWlriS3wQUXFj91oiIiIiKmpTp05FW1sbFixYgGAwiGOOOQYPPvggO6YTlQiW1xIREREREVHOsLyWiIiIiIiIcoYXnURERERERJQzeZvT+eGHH8LtdqfcHgqFpLeTeTyGmeMxzAyPX+Z4DK0LhUI4/vjjC70bJY3ZnDs8hpnjMcwMj1/meAyt08vmvF10ut1u+Hy+lNv9fr/0djKPxzBzPIaZ4fHLHI+hdWbW2iNjzObc4THMHI9hZnj8MsdjaJ1eNrO8loiIiIiIiHKGF51ERERERESUM7zoJCIiIiIiopzhRScRERERERHlDC86iYiIiIiIKGd40UlEREREREQ5w4tOIiIiIiIiyhledBIREREREVHO8KKTiIiIiIiIcoYXnURERERERJQzvOgkIiIiIiKinOFFJxEREREREeUMLzqJqOw0BQIY1dICR3MzRrW0oCkQKPQuERER9WnM5r7NVegd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\n",
      "text/plain": [
       "<Figure size 1152x432 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "X, y = create_dataset(1000, 2, 2, alpha=2)\n",
    "\n",
    "a = GaussianMixture(2, n_init=1, max_iter=25).fit(X)\n",
    "b = GeneralMixtureModel.from_samples(MultivariateGaussianDistribution, 2, X, max_iterations=25)\n",
    "\n",
    "y1, y2 = a.predict(X), b.predict(X)\n",
    "\n",
    "plt.figure(figsize=(16,6))\n",
    "plt.subplot(121)\n",
    "plt.title(\"sklearn clusters\", fontsize=14)\n",
    "plt.scatter(X[y1==0, 0], X[y1==0, 1], color='m', edgecolor='m')\n",
    "plt.scatter(X[y1==1, 0], X[y1==1, 1], color='c', edgecolor='c')\n",
    "\n",
    "plt.subplot(122)\n",
    "plt.title(\"pomegranate clusters\", fontsize=14)\n",
    "plt.scatter(X[y2==0, 0], X[y2==0, 1], color='m', edgecolor='m')\n",
    "plt.scatter(X[y2==1, 0], X[y2==1, 1], color='c', edgecolor='c')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It looks like we're getting the same basic results for the two. The two algorithms are initialized a bit differently, and so it can be difficult to directly compare the results between them, but it looks like they're getting roughly the same results."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. Multivariate Gaussian HMM\n",
    "\n",
    "Now let's move on to training a hidden Markov model with multivariate Gaussian emissions with a diagonal covariance matrix. We'll randomly generate some Gaussian distributed numbers and use pomegranate with either one or four threads to fit our model to the data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "pomegranate Gaussian HMM (1 job)\n",
      "17.2 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n",
      "\n",
      "pomegranate Gaussian HMM (2 jobs)\n",
      "26.1 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n"
     ]
    }
   ],
   "source": [
    "X = numpy.random.randn(1000, 500, 50)\n",
    "\n",
    "print(\"pomegranate Gaussian HMM (1 job)\")\n",
    "%timeit -n 1 -r 1 HiddenMarkovModel.from_samples(NormalDistribution, 5, X, max_iterations=5)\n",
    "print()\n",
    "print(\"pomegranate Gaussian HMM (2 jobs)\")\n",
    "%timeit -n 1 -r 1 HiddenMarkovModel.from_samples(NormalDistribution, 5, X, max_iterations=5, n_jobs=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "All we had to do was pass in the n_jobs parameter to the fit function in order to get a speed improvement. It looks like we're getting a really good speed improvement, as well! This is mostly because the HMM algorithms perform a lot more operations than the other models, and so spend the vast majority of time with the GIL released. You may not notice as strong speedups when using a MultivariateGaussianDistribution because BLAS uses multithreaded operations already internally, even when only one job is specified.\n",
    "\n",
    "Now lets look at the prediction function to make sure the we're getting speedups there as well. You'll have to use a wrapper function to parallelize the predictions for a HMM because it returns an annotated sequence rather than a single value like a classic machine learning model might."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "pomegranate Gaussian HMM (1 job)\n",
      "3.87 s ± 103 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
      "\n",
      "pomegranate Gaussian HMM (2 jobs)\n",
      "8.96 s ± 191 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    }
   ],
   "source": [
    "model = HiddenMarkovModel.from_samples(NormalDistribution, 5, X, max_iterations=2, verbose=False)\n",
    "\n",
    "print(\"pomegranate Gaussian HMM (1 job)\")\n",
    "%timeit predict_proba(model, X)\n",
    "print()\n",
    "print(\"pomegranate Gaussian HMM (2 jobs)\")\n",
    "%timeit predict_proba(model, X, n_jobs=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Great, we're getting a speedup on that as well, albiet a minor one. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Conclusions\n",
    "\n",
    "Hopefully you'll find pomegranate useful in your work! Parallelization should allow you to train complex models faster than before. Keep in mind though that there is an overhead to using parallel processing, and so it's possible that on some smaller examples it does not work as well. In general, the bigger the dataset, the closer to a linear speedup you'll get with pomegranate.\n",
    "\n",
    "If you have any interesting examples of how you've used pomegranate in your work, I'd love to hear about them. In addition I'd like to hear any feedback you may have on features you'd like to see. Please shoot me an email. Good luck!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
